/**
 * 游戏主类
 * 负责管理游戏状态和协调各个组件
 */
class Game {
    constructor() {
        // 游戏状态
        this.isRunning = false;
        this.isPaused = false;
        this.difficulty = 'medium';
        
        // 添加音频管理器
        this.audioManager = new AudioManager();
        
        // 游戏组件
        this.typingManager = new TypingManager(this);
        this.characterManager = new CharacterManager(this);
        this.policeAI = new PoliceAI(this);
        this.itemManager = new ItemManager(this);
        this.scoreManager = new ScoreManager();
        
        // 游戏计时器
        this.timer = new Timer();
        
        // 游戏数据
        this.gameData = {
            wpm: 0,
            accuracy: 100,
            elapsedTime: 0,
            distance: 80, // 初始距离为屏幕宽度的80%
            gameOver: false
        };
        
        // 游戏循环
        this.gameLoopId = null;
        
        // UI管理器 - 放在最后初始化
        this.uiManager = new UIManager(this);
        
        // 检查是否存在障碍物和里程碑管理器类
        try {
            // 障碍物管理器
            if (typeof ObstacleManager === 'function') {
                this.obstacleManager = new ObstacleManager(this);
            }
            
            // 里程碑管理器
            if (typeof MilestoneManager === 'function') {
                this.milestoneManager = new MilestoneManager(this);
            }
        } catch (e) {
            console.error('初始化管理器时出错:', e);
        }
        
        // 绑定方法
        this.gameLoop = this.gameLoop.bind(this);
        
        // 播放主界面背景音乐
        setTimeout(() => {
            this.audioManager.playMusic('background');
        }, 500);
        
        console.log('Game 构造函数完成，isRunning:', this.isRunning);
    }
    
    /**
     * 开始游戏
     */
    start() {
        console.log('Game.start() 被调用');
        
        // 如果游戏已经在运行，不做处理
        if (this.isRunning) {
            console.log('游戏已经在运行中');
            return;
        }
        
        console.log('游戏开始初始化');
        
        // 设置游戏状态
        this.isRunning = true;
        this.isPaused = false;
        
        console.log('游戏状态设置为运行中:', this.isRunning);
        
        // 显示游戏界面
        this.uiManager.showScreen('game');
        
        // 停止主界面背景音乐，播放游戏背景音乐
        this.audioManager.stopMusic('background');
        this.audioManager.playMusic('startGame');
        
        // 初始化计时器
        this.timer.start();
        
        // 初始化打字管理器
        this.typingManager.init();
        
        // 加载文本
        this.typingManager.loadText(this.difficulty);
        
        // 初始化角色
        this.characterManager.init();
        
        // 初始化警察AI
        this.policeAI.init();
        
        // 初始化道具系统
        this.itemManager.init();
        
        // 初始化障碍物和里程碑管理器（如果存在）
        try {
            if (this.obstacleManager) {
                this.obstacleManager.init();
            }
            
            if (this.milestoneManager) {
                this.milestoneManager.init();
            }
        } catch (e) {
            console.error('初始化障碍物或里程碑管理器时出错:', e);
        }
        
        // 开始游戏循环
        this.lastUpdateTime = Date.now();
        this.gameLoopId = requestAnimationFrame(this.gameLoop.bind(this));
        
        // 5秒后警察开始追赶
        this.policeStartTimeout = setTimeout(() => {
            this.policeAI.startChasing();
        }, 5000);
        
        console.log('游戏初始化完成，isRunning:', this.isRunning);
    }
    
    /**
     * 游戏循环
     * @param {number} timestamp 当前时间戳
     */
    gameLoop(timestamp) {
        // 如果游戏暂停或结束，不执行游戏循环
        if (this.isPaused || !this.isRunning) {
            return;
        }
        
        // 计算帧间隔时间
        const deltaTime = timestamp - (this.lastFrameTime || timestamp);
        this.lastFrameTime = timestamp;
        
        // 更新游戏时间
        this.gameData.elapsedTime = this.timer.getElapsedTime();
        
        // 更新打字速度和正确率
        this.gameData.wpm = this.typingManager.calculateWPM();
        this.gameData.accuracy = this.typingManager.calculateAccuracy();
        
        // 更新角色状态（基于打字频率）
        this.characterManager.update();
        
        // 更新角色位置（基于文本进度）
        this.characterManager.updatePosition();
        
        // 更新警察AI
        if (this.policeAI.isChasing) {
            this.policeAI.update(this.gameData.elapsedTime);
            
            // 更新警察位置
            this.policeAI.updatePosition();
            
            // 更新距离
            this.gameData.distance = this.policeAI.calculateDistance(this.gameData.wpm);
            
            // 检查游戏是否结束（警察追上小偷）
            if (this.gameData.distance <= 0) {
                this.end(false);
                return;
            }
        }
        
        // 检查游戏是否结束（完成全部文本）
        if (this.typingManager.isCompleted()) {
            console.log('文本输入完成，触发游戏成功结束');
            this.end(true);
            return;
        }
        
        // 更新UI
        this.updateUI();
        
        // 更新背景滚动速度（基于打字频率）
        const frequency = this.typingManager.getTypingFrequency();
        this.updateBackgroundScroll(frequency);
        
        // 继续游戏循环
        this.gameLoopId = requestAnimationFrame(this.gameLoop);
    }
    
    /**
     * 更新UI
     */
    updateUI() {
        // 更新WPM显示
        document.getElementById('wpm-display').textContent = `${Math.round(this.gameData.wpm)} WPM`;
        
        // 更新正确率显示
        document.getElementById('accuracy-display').textContent = `${Math.round(this.gameData.accuracy)}%`;
        
        // 更新时间显示
        document.getElementById('time-display').textContent = this.formatTime(this.gameData.elapsedTime);
        
        // 更新道具显示
        const itemName = this.itemManager.currentItem ? this.itemManager.currentItem.name : '无';
        document.getElementById('item-display').textContent = itemName;
        
        // 更新距离条
        document.getElementById('distance-indicator').style.width = `${this.gameData.distance}%`;
    }
    
    /**
     * 结束游戏
     * @param {boolean} success 是否成功
     */
    end(success) {
        // 如果游戏已经结束，不做处理
        if (!this.isRunning || this.gameData.gameOver) {
            return;
        }
        
        console.log(`游戏结束，结果: ${success ? '成功' : '失败'}`);
        
        // 设置游戏状态
        this.isRunning = false;
        this.gameData.gameOver = true;
        
        // 停止计时器
        this.timer.stop();
        
        // 取消游戏循环
        if (this.gameLoopId) {
            cancelAnimationFrame(this.gameLoopId);
            this.gameLoopId = null;
        }
        
        // 停止游戏背景音乐
        this.audioManager.stopMusic('startGame');
        
        // 计算最终得分
        const finalScore = this.scoreManager.calculateFinalScore(
            this.gameData.wpm,
            this.gameData.accuracy,
            this.gameData.elapsedTime,
            success
        );
        
        // 确保UI管理器存在
        if (!this.uiManager) {
            console.error('UI管理器不存在，无法显示结束界面');
            return;
        }
        
        // 显示结束界面
        setTimeout(() => {
            this.uiManager.showEndScreen(
                success,
                Math.round(this.gameData.wpm),
                Math.round(this.gameData.accuracy),
                this.gameData.elapsedTime,
                finalScore
            );
            
            // 播放结束音效
            if (success) {
                this.audioManager.playSound('success');
            } else {
                this.audioManager.playSound('fail');
            }
        }, 500); // 延迟500毫秒显示结束界面，确保游戏状态已完全更新
        
        console.log('游戏结束处理完成');
    }
    
    /**
     * 重新开始游戏
     */
    restart() {
        // 使用当前难度重新开始游戏
        this.start(this.difficulty);
    }
    
    /**
     * 重置游戏状态
     */
    reset() {
        // 重置游戏数据
        this.gameData = {
            wpm: 0,
            accuracy: 100,
            elapsedTime: 0,
            distance: 80,
            gameOver: false
        };
        
        // 重置组件
        this.typingManager.reset();
        this.characterManager.reset();
        this.policeAI.reset();
        this.itemManager.reset();
        
        // 重置计时器
        this.timer.reset();
        
        // 取消游戏循环
        if (this.gameLoopId) {
            cancelAnimationFrame(this.gameLoopId);
            this.gameLoopId = null;
        }
        
        // 重置UI
        this.updateUI();
    }
    
    /**
     * 暂停游戏
     */
    pause() {
        if (this.isRunning && !this.isPaused) {
            this.isPaused = true;
            this.timer.pause();
            console.log('游戏暂停');
        }
    }
    
    /**
     * 恢复游戏
     */
    resume() {
        if (this.isRunning && this.isPaused) {
            this.isPaused = false;
            this.timer.resume();
            this.gameLoopId = requestAnimationFrame(this.gameLoop);
            console.log('游戏恢复');
        }
    }
    
    /**
     * 格式化时间
     * @param {number} seconds 秒数
     * @returns {string} 格式化后的时间字符串 (MM:SS)
     */
    formatTime(seconds) {
        const minutes = Math.floor(seconds / 60);
        const remainingSeconds = Math.floor(seconds % 60);
        return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
    }
    
    /**
     * 更新背景滚动速度
     * @param {number} frequency 当前打字频率
     */
    updateBackgroundScroll(frequency) {
        const gameScene = document.getElementById('game-scene');
        if (!gameScene) return;
        
        // 移除所有滚动类
        gameScene.classList.remove('scroll-slow', 'scroll-medium', 'scroll-fast', 'scroll-very-fast');
        
        // 根据打字频率设置滚动速度
        if (frequency >= 180) {
            gameScene.classList.add('scroll-very-fast');
        } else if (frequency >= 120) {
            gameScene.classList.add('scroll-fast');
        } else if (frequency >= 60) {
            gameScene.classList.add('scroll-medium');
        } else {
            gameScene.classList.add('scroll-slow');
        }
    }
} 